/* ==========================================================
 * sco.tab.js
 * http://github.com/terebentina/sco.js
 * ==========================================================
 * Copyright 2019 Dan Caragea.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */

/*jshint laxcomma:true, sub:true, browser:true, jquery:true, devel:true */

;(function ($, undefined) {
    "use strict";

    var pluginName = 'scojs_tab';

    function Tab($header_wrapper, options) {
        this.options = $.extend({}, $.fn[pluginName].defaults, options);
        this.$header_wrapper = $header_wrapper;

        if (this.options.content === undefined) {
            this.options.content = this.$header_wrapper[this.options.mode]('.pane-wrapper');
        }

        var self = this
            , auto_click = false
        ;
        if (typeof this.options.onBeforeSelect == 'function') {
            this.options.onBeforeSelect = $.proxy(this.options.onBeforeSelect, self);
        }

        this.panes = $.scojs_panes(this.options.content, this.options);
        this.$header_wrapper.find('> li').removeClass('active').eq(this.options.active).addClass('active');

        this.$header_wrapper.on('click.' + pluginName, 'a', function (e) {
            var $this = $(this)
                , $my_li = $this.closest('li')
                , my_index = $my_li.index()
            ;

            if (!$.address || $this.attr('href') == '#') {
                e.preventDefault();
            }

            if (self.panes.select(my_index)) {
                self.$header_wrapper.find('> li.active').removeClass('active');
                $my_li.addClass('active');
            }
        });

        if ($.address) {
            $.address.externalChange(function (e) {
                var hash = '#' + e.value.slice(1);
                self.$header_wrapper.find('> li a').each(function () {
                    var $this = $(this);
                    if ($this.attr('href') === hash) {
                        $this.trigger('click');
                        return false;
                    }
                });
            }).history(true);
        }
    }

    $.extend(Tab.prototype, {
        select: function (index) {
            this.$header_wrapper.find('> li:eq(' + index + ') a').trigger('click');
            return this;
        }
    });


    $.fn[pluginName] = function (options) {
        return this.each(function () {
            var obj;
            if (!(obj = $.data(this, pluginName))) {
                var $this = $(this)
                    , data = $this.data()
                    , opts = $.extend({}, $.fn[pluginName].defaults, options, data)
                ;
                obj = new Tab($this, opts);
                $.data(this, pluginName, obj);
            }
        });
    };


    $[pluginName] = function (elem, options) {
        if (typeof elem === 'string') {
            elem = $(elem);
        }
        return new Tab(elem, options);
    };


    $.fn[pluginName].defaults = {
        active: 0
        , mode: 'next'                       // "next" means panes are under headers, "prev" means panes are above headers
        , easing: ''
    };

    $(function () {
        $('[data-trigger="tab"]')[pluginName]();
    });
})(jQuery);
